/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Compresor;

import java.io.Serializable;
import java.util.*;

/**
 *
 * @author asc
 */
public class Diccionario implements Serializable
{

    HashMap<String , String> tablaRoseta;
    

    public Diccionario()
    {
        tablaRoseta = new HashMap<String , String>();
    }

    public HashMap<String, String>  Huffman( LexicalAnalisis analex )
    {
        HashMap<String, String> conversor= new HashMap<String , String>();
        LinkedList<Mensaje> lMensajes = new LinkedList<Mensaje>();
        
        HashMap<String,Integer> tmp2 = analex.getProbabilidades();
        Set<String> tmp3=tmp2.keySet();
       
        System.out.println("---------------");
        for(String s :  tmp3)
        {
            if(s!="")
            {
                System.out.println(s + "\t" + tmp2.get(s));
                String x = new String(s);
                lMensajes.push(new Mensaje(x , tmp2.get(s)));
            }
        }
        
        if (lMensajes.size() != 0)
        {
            Collections.sort(lMensajes);
            /*
            System.out.println("ORDENADOS");
            for(Mensaje x : lMensajes)
            {
                System.out.println(x.getpMensajes().toString());
            }
            System.out.println("FINORDENADOS");
            System.out.println("-----------------------------------------------------------");
            */
            while (lMensajes.size() >= 2)
            {   
                ListIterator<Mensaje> it1= lMensajes.listIterator(lMensajes.size());
                final Mensaje mensn1 = it1.previous();
                final Mensaje mensn2 = it1.previous();
                /*
                System.out.println("AFECTADOS");
                System.out.println("Mens1:" + mensn1.getpMensajes().toString());
                System.out.println("Mens2:" + mensn2.getpMensajes().toString());
                System.out.println("FINAFECTADOS");
                */
                for(String s : mensn2.getpMensajes())
                {
                    
                    if(conversor.containsKey(s))
                    {
                         String tmp = conversor.get(s);
                         tmp = Character.toString('0') + tmp;
                         conversor.put(s, tmp);
                    }
                    else
                    {
                        String tmp = Character.toString('0');
                        conversor.put(s, tmp);
                    }
                }
                
                for(String s : mensn1.getpMensajes())
                {
                    if(conversor.containsKey(s))
                    {
                         String tmp = conversor.get(s);
                         tmp = Character.toString('1') + tmp;
                         conversor.put(s, tmp);
                    }
                    else
                    {
                        String tmp = Character.toString('1');
                        conversor.put(s, tmp);
                    }
                }
                
                for(String s : mensn1.getpMensajes())
                {
                    mensn2.addMensaje(s);
                }

                mensn2.sumProbabilidad(mensn1.getProbabilidad());

                lMensajes.removeLast();
                Collections.sort(lMensajes);
            }
        }
        lMensajes = null;
        
        for(String s : conversor.keySet())
        {
            tablaRoseta.put(conversor.get(s).toString(),s);
        }
        
        for(String a : conversor.keySet())
        {
            System.out.println(a + "-" + conversor.get(a));
        }
        /*
        System.out.println("TRADUCCIONES");
        for(String s : tablaRoseta.keySet())
        {
            System.out.println(s + "-" + tablaRoseta.get(s).toString() );
        }
        System.out.println("FINTRADUCCIONES");
        System.out.println("-----------------------------------------------------------");
        */
        return conversor;
    }

    public HashMap<String, String> getTablaRoseta() {
        return tablaRoseta;
    }
}
